# -*- coding:utf-8 -*-
# title           :
# description     :
# author          :Python超人/三月三提供
# date            :2024-07-15
# link            :https://gitcode.net/pythoncr/
# python_version  :3.9
# ==============================================================================

from 神笔码靓.神笔库.神笔绘图板 import 神笔绘图板
from 神笔码靓.神笔库.定义集 import *
from 神笔码靓.神笔库.配置 import *
from 神笔码靓.神笔库.通用工具集 import *


class 中国象棋制作(神笔绘图板):
    def __init__(self, 文件路径, 棋子背景色=None, 棋子轮廓色=None, 棋盘背景色=None, 棋盘格颜色=None, 棋子布局两侧=是):
        宽, 高 = 纸张大小.A4_纵向(1)
        super(中国象棋制作, self).__init__(作品文件路径=文件路径, 宽=宽, 高=高)
        self.左边距, self.右边距 = 60, 60
        self.上边距, self.下边距 = 20, 20
        # self.显示图框()
        # if 棋盘背景色 is not None:
        #     self.设置背景色(棋盘背景色)
        # self.设置背景色("#EEBC73")
        self.棋盘背景色 = 颜色.透明 if 棋盘背景色 is None else 棋盘背景色
        self.棋子背景色 = "#E3CA92" if 棋子背景色 is None else 棋子背景色
        self.棋子轮廓色 = "#905B18" if 棋子轮廓色 is None else 棋子轮廓色
        self.棋盘格颜色 = 颜色.黑色 if 棋盘格颜色 is None else 棋盘格颜色
        self.棋子布局两侧 = 棋子布局两侧

    # def 加载字体样式(self, 字体):
    #     self.样式.设置字体样式(字体)

    def 造棋盘(self):
        if self.棋子布局两侧:
            位移Y = 0
        else:
            位移Y = 115

        棋盘单元格宽 = (self.宽 - self.左边距 - self.右边距) // 8
        棋盘开始位置Y = (self.高 - 棋盘单元格宽 * 9) / 2 + 位移Y
        棋盘开始位置X = self.左边距
        棋盘外框边距 = 5

        # TODO: 棋子位置对齐参考线
        # 余量参考线 = 40
        # self.连直线([(self.左边距, 棋盘开始位置Y - 余量参考线 + 位移Y), (self.宽 - self.右边距, 棋盘开始位置Y - 余量参考线 + 位移Y)])
        # self.连直线([(self.左边距, 棋盘开始位置Y + 棋盘单元格宽 * 9 + 余量参考线 + 位移Y),
        #           (self.宽 - self.右边距, 棋盘开始位置Y + 棋盘单元格宽 * 9 + 余量参考线 + 位移Y)])

        # 裁剪线
        裁剪余量 = 38
        self.画矩形(x=棋盘开始位置X - 裁剪余量, y=棋盘开始位置Y - 裁剪余量,
                 宽=棋盘单元格宽 * 8 + 裁剪余量 * 2, 高=棋盘单元格宽 * 9 + 裁剪余量 * 2, 填充颜色=self.棋盘背景色,
                 描边颜色=self.棋盘格颜色, 描边样式="2,2", 描边宽度=0.5)

        # 棋盘表格
        self.画表格(x=self.左边距, y=棋盘开始位置Y, 列宽=棋盘单元格宽, 列数=8, 行高=棋盘单元格宽, 行数=4, 描边颜色=self.棋盘格颜色)
        self.画表格(x=self.左边距, y=棋盘开始位置Y + 棋盘单元格宽 * 5, 列宽=棋盘单元格宽, 列数=8, 行高=棋盘单元格宽, 行数=4,
                 描边颜色=self.棋盘格颜色)
        # 棋盘内框
        self.画矩形(x=棋盘开始位置X, y=棋盘开始位置Y, 宽=棋盘单元格宽 * 8, 高=棋盘单元格宽 * 9, 描边颜色=self.棋盘格颜色)
        # 棋盘外框粗线
        self.画矩形(x=棋盘开始位置X - 棋盘外框边距, y=棋盘开始位置Y - 棋盘外框边距,
                 宽=棋盘单元格宽 * 8 + 棋盘外框边距 * 2, 高=棋盘单元格宽 * 9 + 棋盘外框边距 * 2, 描边宽度=3, 描边颜色=self.棋盘格颜色)

        # “士”的路线 X
        self.连线([
            ("移动", self.左边距 + 3 * 棋盘单元格宽, 棋盘开始位置Y),
            (self.左边距 + 5 * 棋盘单元格宽, 棋盘开始位置Y + 2 * 棋盘单元格宽),
            ("移动", self.左边距 + 5 * 棋盘单元格宽, 棋盘开始位置Y),
            (self.左边距 + 3 * 棋盘单元格宽, 棋盘开始位置Y + 2 * 棋盘单元格宽),
            ("移动", self.左边距 + 3 * 棋盘单元格宽, 棋盘开始位置Y + 7 * 棋盘单元格宽),
            (self.左边距 + 5 * 棋盘单元格宽, 棋盘开始位置Y + 9 * 棋盘单元格宽),
            ("移动", self.左边距 + 5 * 棋盘单元格宽, 棋盘开始位置Y + 7 * 棋盘单元格宽),
            (self.左边距 + 3 * 棋盘单元格宽, 棋盘开始位置Y + 9 * 棋盘单元格宽),
        ], 描边颜色=self.棋盘格颜色)

        # 十字模板
        线段长 = 0.15 * 棋盘单元格宽
        线段贴近 = 0.08 * 棋盘单元格宽
        x = self.左边距 + 线段贴近
        y3 = 棋盘开始位置Y + 3 * 棋盘单元格宽

        十右半 = self.连线([("移动", x, y3 - 线段贴近 - 线段长),
                       ("垂直线", y3 - 线段贴近), ("水平线", self.左边距 + 线段贴近 + 线段长),
                       ("移动", x, y3 + 线段贴近 + 线段长),
                       ("垂直线", y3 + 线段贴近), ("水平线", self.左边距 + 线段贴近 + 线段长)], 描边颜色=self.棋盘格颜色)

        十左半 = self.连线([("移动", self.左边距 + 2 * 棋盘单元格宽 - 线段贴近, y3 - 线段贴近 - 线段长),
                       ("垂直线", y3 - 线段贴近), ("水平线", self.左边距 + 2 * 棋盘单元格宽 - 线段贴近 - 线段长),
                       ("移动", self.左边距 + 2 * 棋盘单元格宽 - 线段贴近, y3 + 线段贴近 + 线段长),
                       ("垂直线", y3 + 线段贴近), ("水平线", self.左边距 + 2 * 棋盘单元格宽 - 线段贴近 - 线段长)
                       ], 描边颜色=self.棋盘格颜色)

        十右半模板 = self.创建模板(元素列表=[十右半])
        十左半模板 = self.创建模板(元素列表=[十左半])

        # “兵卒”位置十字
        for i in range(4):
            十右半模板.创造元素(x=i * 2 * 棋盘单元格宽, y=0)
            十右半模板.创造元素(x=i * 2 * 棋盘单元格宽, y=3 * 棋盘单元格宽)
            十左半模板.创造元素(x=i * 2 * 棋盘单元格宽, y=0)
            十左半模板.创造元素(x=i * 2 * 棋盘单元格宽, y=3 * 棋盘单元格宽)

        # “炮”位置十字
        for x_ in [棋盘单元格宽, 7 * 棋盘单元格宽]:
            for y_ in [-棋盘单元格宽, 4 * 棋盘单元格宽]:
                十右半模板.创造元素(x=x_, y=y_)
                十左半模板.创造元素(x=x_ - 2 * 棋盘单元格宽, y=y_)

        # 楚河汉界
        字体大小 = 55
        self.写字(x=self.宽 * 0.25, y=self.高 / 2 + 位移Y, 文字="楚　河", 字体大小=字体大小, 字体=系统字体.隶书,
                填充颜色=self.棋盘格颜色).字旋转(-90).平移(48, 15)
        self.写字(x=self.宽 * 0.75, y=self.高 / 2 + 位移Y, 文字="界　汉", 字体大小=字体大小, 字体=系统字体.隶书,
                填充颜色=self.棋盘格颜色).字旋转(90).平移(0, -40)

        # TODO: 楚河汉界对齐参考线
        # self.连直线([(self.左边距, self.高 / 2 + 25), (self.宽 - self.右边距, self.高 / 2 + 25)])
        # self.连直线([(self.左边距, self.高 / 2 - 25), (self.宽 - self.右边距, self.高 / 2 - 25)])

        # self.写字(x=self.宽 / 2, y=self.高 / 2 + 位移Y, 文字="神笔码靓", 字体大小=字体大小 / 1.5, 字体="小篆体",
        #         填充颜色=self.棋盘格颜色, 透明度=0.7)

        self.写软件信息(x=self.宽 / 2, y=self.高 / 2 + 位移Y, 字体大小=字体大小 / 1.5, 填充颜色=self.棋盘格颜色,
                   水平基线对齐=文字水平基线对齐.中点对齐)
        if self.棋子布局两侧:
            self.写网址信息(x=self.宽 - self.左边距, y=self.高 - self.下边距 - 140, 字体大小=字体大小 / 4)
        else:
            self.写网址信息(x=self.宽 - self.左边距, y=self.高 - self.下边距 - 字体大小 / 4-11, 字体大小=字体大小 / 4)

        # 制作水印
        # self.写字(x=self.宽 - self.右边距, y=self.上边距, 文字="作制靓码笔神",
        #         水平基线对齐=文字水平基线对齐.结束点对齐, 垂直基线对齐=文字垂直基线对齐.顶线对齐,
        #         字体=系统字体.TimesNewRoman, 字体大小=18, 填充颜色=颜色.灰色). \
        #     旋转(旋转角度=-90, 旋转中心点=(self.宽 - self.右边距, self.上边距)).字旋转(90)

    def 构建棋子(self, x, y, 棋子名, 字体大小, 棋字颜色):
        棋字下移 = 5
        象棋字体 = 系统字体.隶书

        self.画圆(x=x, y=y, 半径=字体大小 / 1.55, 描边颜色=self.棋子轮廓色, 填充颜色=self.棋子背景色)
        self.画圆(x=x, y=y, 半径=字体大小 / 1.6).模糊(模糊度=1)
        self.写字(x=x, y=y + 棋字下移, 文字=棋子名, 字体大小=字体大小, 填充颜色=棋字颜色,
                # 水平基线对齐=文字水平基线对齐.起始点对齐, 垂直基线对齐=文字垂直基线对齐.顶线对齐,
                字体=象棋字体)
        # self.画圆(x=x, y=y, 半径=字体大小 / 1.99, 描边颜色=颜色.黑色, 描边宽度=2).模糊(模糊度=1) # 立体感
        self.画圆(x=x, y=y, 半径=字体大小 / 1.93, 描边颜色=棋字颜色, 描边宽度=2)

    def 造棋子(self):
        列宽 = (self.宽 - self.左边距 - self.右边距) // 8
        字体大小 = 50
        棋子行距 = 字体大小 * 1.13
        上边调整 = 24
        下边调整 = 31

        红子 = "車馬相仕帅仕相馬車兵兵兵兵兵炮炮"
        黑子 = "車馬象士将士象馬車卒卒卒卒卒砲砲"

        xi, yi = 0, 0
        错开偏移 = 0.25
        # 创建红子
        for i, 子 in 索引列举(红子):
            if xi >= len(红子) // 2:
                xi = 0
                yi += 1
                错开偏移 = 0.75
            x = self.左边距 + 列宽 * (xi + 错开偏移)
            y = yi * 棋子行距 + self.上边距 + 上边调整
            self.构建棋子(x, y, 子, 字体大小, 颜色.红色)
            xi += 1

        if self.棋子布局两侧:
            位移Y = 0
        else:
            位移Y = -830

        # 创建黑子
        xi, yi = 0, 0
        错开偏移 = 0.25
        for i, 子 in 索引列举(黑子):
            if xi >= 返回长度(黑子) // 2:
                xi = 0
                yi += 1
                错开偏移 = 0.75
            x = self.左边距 + 列宽 * (xi + 错开偏移)
            y = yi * 棋子行距 + self.高 - self.下边距 - 字体大小 - 下边调整
            self.构建棋子(x, y + 位移Y, 子, 字体大小, 颜色.黑色)
            xi += 1

    def 页面设置(self, 设置: 纸张设置):
        # 输出 PDF 文件，以及 页面打印，在这里设置好
        设置.上页边距 = "0.25cm"
        设置.下页边距 = 0
        设置.左页边距 = "0.35cm"
        设置.右页边距 = 0
        设置.页面缩放 = 1

    def 创作(self):
        self.造棋盘()
        self.造棋子()
